#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <pthread.h>
#include <cstring>
#include <cerrno>
using namespace std;

// void *ThreadRun(void *name)
// {
//     //打印新线程的PID
//     printf("%s:pid:%d\n", (char *)name, getpid());
//     while (1)
//         sleep(1);
// }

// int main()
// {
//     //打印主线程的PID
//     printf("%s:pid:%d\n", "main thread", getpid());
//     pthread_t tid[5];
//     char name[50];
//     for (int i = 0; i < 5; ++i)
//     {
//         snprintf(name, sizeof(name), "%s-%d", "thread", i);
//         //循环创建新线程
//         pthread_create(tid + i, nullptr, ThreadRun, (void *)name);
//         sleep(1);
//     }
//     while (1)
//         sleep(1);

//     return 0;
// }

// void *ThreadRoutine(void *name)
// {
//     //int cnt = 3;
//     while (1)
//     {
//         printf("[%d]: %s\n", getpid(), (char *)name);
//         sleep(1);
//     }
//     //cnt /= 0; // 除0错误
//     return nullptr;
// }

// void test1()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRoutine, (void *)"child thread 1");
//     while (1)
//     {
//         printf("[%d]: main thread\n", getpid());
//         sleep(1);
//     }
// }

// void func()
// {
//     pthread_exit((void *)13);
// }

// void *ThreadRoutine(void *name)
// {
//     int cnt = 3;
//     while (cnt--)
//     {
//         printf("[%d]: %s\n", getpid(), (char *)name);
//         sleep(1);
//     }
//     cout << "child thread quit!" << endl;
//     // return (void *)10; // 线程函数返回，线程退出
//     func();
//     cout << "you can't see me!" << endl;
// }

// void test2()
// {
//     printf("[%d]: main thread\n", getpid());
//     pthread_t tid;
//     void *ret;
//     pthread_create(&tid, nullptr, ThreadRoutine, (void *)"child thread 1");
//     pthread_join(tid, &ret); // 阻塞等待子线程退出
//     cout << "main thread quit!" << endl;
//     cout << "child thread return value: " << (long long)ret << endl;
// }

// void *ThreadRoutine(void *data)
// {
//     printf("[%d]: %s\n", getpid(), "child thread running!");
//     // 子线程处理堆空间数据
//     for (int i = 0; i < 10; ++i)
//     {
//         ((int *)data)[i] = i;
//     }
//     printf("[%d]: %s\n", getpid(), "child thread quit!");
//     // 线程函数返回，线程退出
//     return (void *)data; // 返回堆空间的指针
// }

// void test3()
// {
//     printf("[%d]: main thread running!\n", getpid());
//     int *data = new int[10]{0};
//     cout << "before: ";
//     for (int i = 0; i < 10; ++i)
//     {
//         cout << data[i] << " ";
//     }
//     cout << endl;

//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRoutine, (void *)data); // 将堆空间数据传递给子线程
//     int *ret;
//     pthread_join(tid, (void **)&ret); // 阻塞等待子线程退出

//     cout << "after: ";
//     for (int i = 0; i < 10; ++i)
//     {
//         cout << data[i] << " ";
//     }
//     cout << endl;
//     for (int i = 0; i < 10; ++i)
//     {
//         cout << ret[i] << " ";
//     }
//     cout << endl;
//     printf("[%d]: main thread quit!\n", getpid());
//     // data和ret指向的堆空间相同，地址相同
//     printf("[%d]: child thread return value: %p:%p\n", getpid(), ret, data);
// }

// void *ThreadRoutine(void *arg)
// {
//     while (true)
//     {
//         cout << "child thread running..." << endl;
//         sleep(1);
//     }
//     pthread_exit((void *)12); // 子线程不会执行到这里
// }

// void test4()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRoutine, nullptr);
//     sleep(3);
//     pthread_cancel(tid); // 向子线程发送取消请求
//     void *ret;
//     pthread_join(tid, &ret);
//     cout << "cancel child thread, tid: " << tid << " retval: " << (long long)ret << endl;
//     sleep(2);
// }

// __thread int g_val = 0;

// void* ThreadRoutine(void* name)
// {
//     while(true)
//     {
//         sleep(1);
//         cout << (char*)name << pthread_self() << " g_val: " << g_val << " &g_val: " << &g_val << endl;
//         ++g_val;
//     }

// }

// void test5()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRoutine, (void*)"child thread 1");
//     while(true)
//     {
//         cout << "main thread: " << pthread_self() << " g_val: " << g_val << " &g_val: " << &g_val << endl;
//         sleep(1);
//     }
// }

// void *ThreadRoutine(void *name)
// {
//     cout << "child thread running..." << endl;
//     //sleep(2);
//     //execl("/home/zty/code/Linux/thread/test", "test", nullptr);
//     //execl("./test", "test", nullptr); //进程程序替换
//     return nullptr;
// }

// void test6()
// {
//     cout << "main thread running..." << endl;
//     sleep(2);
//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRoutine, nullptr);
//     while(1) sleep(1);
// }

void *ThreadRoutine(void *arg)
{
    //pthread_detach(pthread_self()); //线程分离
    cout << "child thread running..." << endl;
    errno = 5;
    cout << errno << endl;
    sleep(2);
    pthread_exit((void*)12);
}

void test7()
{
    errno = 10;
    cout << "main thread running..." << endl;
    cout << errno << endl;
    pthread_t tid;
    pthread_create(&tid, nullptr, ThreadRoutine, nullptr);
    sleep(1);
    int ret = pthread_join(tid, nullptr);
    cout << errno << endl;
    cout << "ret = " << ret << ", strerrno: " << strerror(ret) << endl;
}

int main()
{
    test7();
    return 0;
}